package com.cheng.example.java.version.java8.chap06_stream;

import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * 不过Map提供了一些新的有用的方法来处理一些日常任务。
 */
public class MapTest {

    static Map<Integer, String> map;

    static {
        map = new HashMap<>();
        for (int i = 0; i < 10; i++) {
            map.putIfAbsent(i, "val" + i);
        }
    }

    /**
     * 1、putIfAbsent 不需要我们做额外的存在性检查，
     * 2、而forEach则接收一个Consumer接口来对map里的每一个键值对进行操作。
     *
     * @param args
     */
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        for (int i = 0; i < 10; i++) {
            map.putIfAbsent(i, "val" + i);
        }
        map.forEach((id, val) -> System.out.println(val));

        //下面的例子展示了map上的其他有用的函数：
        map.computeIfPresent(3, (num, val) -> val + num);
        map.get(3);             // val33
        System.out.println(map.get(3));

        //Present出席
        map.computeIfPresent(9, (num, val) -> null);
        map.containsKey(9);     // false

        //Absent缺席
        map.computeIfAbsent(23, num -> "val" + num);
        map.containsKey(23);    // true
        System.out.println(map.get(23));

        map.computeIfAbsent(3, num -> "bam");
        map.get(3);             // val33
    }


    /**
     * 在Map里删除一个键值全都匹配的项
     */
    @Test
    public void test01() {
        map.remove(3, "val3");
        map.get(3);             // val33
        map.remove(3, "val33");
        map.get(3);             // null
    }


    /**
     * 另外一个有用的方法
     */
    @Test
    public void test02() {
        String s = map.getOrDefault(42, "not found");  // not found
        System.out.println(s);
        System.out.println(map);
    }


    @Test
    public void test03() {
        map.merge(9, "val9", (value, newValue) -> value.concat(newValue));
        map.get(9);             // val9
        System.out.println(map.get(9));
        map.merge(9, "concat", (value, newValue) -> value.concat(newValue));
        map.get(9);             // val9concat
        System.out.println(map.get(9));
    }
}
